package com.siqi.hr.system.custom.dao.intf;

import com.siqi.hr.system.common.model.filter.QueryDataEntity;
import com.siqi.hr.system.custom.entity.FieldRecord;
import com.siqi.hr.system.custom.entity.SelectBox;
import com.siqi.hr.system.organization.entity.FieldControled;
import net.sf.json.JSONObject;

import java.util.List;
import java.util.Map;

/**
 * 实体注册字段dao接口层
 * @author    xiaogq
 * Created by xiaogoingqin on 2016/7/24.
 */
public interface FieldRecordDao {

    /**
     * 根据字段id获取字段id、所属实体id、字段英文名、中文名信息
     * @author              xiaogq
     * @param fieldId      字段id
     * @return
     */
    public FieldRecord getFieldInfo(int fieldId);

    /**
     * 根据实体id以及是否是系统属性标识查询字段注册信息
     * @author              xiaogq
     * @param queryData    分页数据信息
     * @param sysField     系统属性标识(true:系统属性,false:自定义属性)
     * @return
     */
    public List<Map<String, Object>> getFieldRecords(QueryDataEntity queryData, Boolean sysField);

    /**
     * 根据实体id以及是否是系统属性标识查询字段总数
     * @author              xiaogq
     * @param entityId     实体id
     * @param sysField     系统属性标识(true:系统属性,false:自定义属性)
     * @return
     */
    public int getCountFieldRecords(int entityId,Boolean sysField);

    /**
     * 根据实体id查询当前实体所有注册字段的id、name(英文名)、inchinese(中文名)
     * @author              xiaogq
     * @param entityId     实体id
     * @return
     */
    public List<FieldRecord> getFieldRestrictedList(Integer entityId);

    /**
     * 根据实体id查询该实体所有的字段(系统字段与自定义字段)
     * @author                  xiaogq
     * @param entityId         实体id
     * @return
     */
    public List<FieldRecord> getAllFields(int entityId);

    /**
     * 保存实体字段排序方法
     * @author                 xiaogq
     * @param sortIds        排序字段id字符串
     * @return
     */
    public int fieldSortUpdate(String sortIds);

    /**
     * 如果新建的是单选、下拉、下拉多选类型的字段则查询字段注册表中所有的该类型字段信息
     * @author                  xiaogq
     * @return
     */
    public List<FieldRecord> getAllBoxFields();

    /**
     * 根据字段英文名查询字段名是否在当前实体存在(true:已经存在，false：不存在)
     * @author                  xiaogq
     * @return
     */
    public boolean isFieldNameExist(Integer entityId, String fieldName);

    /**
     * 如果新建的是引用类型的字段根据主实体id与被引用实体id获取注册字段表中的字段id及英文名称
     * @author                  xiaogq
     * @param tableCode       主实体id
     * @param quoteEntityId   引用实体id
     * @return
     */
    public List<FieldRecord> getFieldsWitchQuoteEntity(int tableCode, int quoteEntityId);

    /**
     * 根据字段Id查询注册字段信息
     * @author                  xiaogq
     * @param fieldId    注册字段Id
     * @return
     */
    public FieldRecord getFieldRecord(Integer fieldId);

    /**
     * 修改字段信息
     * @author                  xiaogq
     * @param fieldRecord     要修改的字段信息对象
     */
    public int updateFieldRecord(FieldRecord fieldRecord);

    /**
     * 修改注册表中字段信息时同时维护表结构信息
     * @author                  xiaogq
     * @param fnew     修改后注册字段信息
     */
    public void updateFieldColumnStruct(FieldRecord fnew);

    /**
     * 查询当前库中实体表字段是否存在
     * @author                  xiaogq
     * @param      tableCode     实体id
     * @param      fieldName     注册字段英文名
     */
    public boolean checkedFieldIsExist(String fieldName, int tableCode);

    /**
     * 查询当前枚举字段值是否在实体表中被引用
     * @author                     xiaogq
     * @param      tableCode     实体id
     * @param      fieldName     注册字段英文名
     */
    public boolean checkedFieldHasData(String fieldName, int tableCode);

    /**
     * 根据实体id、字段名称删除注册表中字段信息
     * @author                     xiaogq
     * @param      tableCode     实体id
     * @param      fieldName     注册字段英文名
     */
    public void delRegFieldByTableCode(int tableCode,String fieldName);

    /**
     * 根据实体id、字段id获取所有受权限控制的字段信息
     * @author                     xiaogq
     * @param      entityId       实体id
     * @param      fieldId        注册字段英文名
     */
    public Map<String, FieldControled> getFieldControledList(Integer entityId, Integer fieldId);

    /**
     * 字段级权限设置保存方法
     * @author               xiaogq
     * @param entityId     实体id
     * @param fieldId      字段id
     * @param fieldName    字段名称
     * @param authArr      角色字段权限参数
     * @return
     */
    public void saveFieldControled(Integer entityId, Integer fieldId, String fieldName, String[] authArr);

    /**
     * 根据实体id查询下拉框类型字段信息并排除当前下来字段
     * @author               xiaogq
     * @param entityId      实体id
     * @param fieldId       注册字段id
     * @return
     */
    public List<FieldRecord> getFieldsByEntityId(int entityId,int fieldId);

    /**
     * 根据当前字段id获取受约束关系的字段id
     * @author               xiaogq
     * @param fieldId       当前字段id
     * @return
     */
    public Integer getFieldRestricter(Integer fieldId);

    /**
     * 枚举知道定义约束关系保存方法
     * @author                   xiaogq
     * @param fieldId           注册字段id
     * @param resFieldId        新约束关系字段id
     * @param pidresFieldId    原约束关系字段id
     * @return
     */
    public int saveFieldRestricted(Integer fieldId, Integer resFieldId, Integer pidresFieldId);

    /**
     * 查询枚举值定义约束关系列表数据
     * @author                   xiaogq
     * @param fieldId       被约束字段id
     * @param resFieldId    约束字段id
     * @return
     */
    public List<Map<String, Object>> queryRestrictFields(Integer fieldId, Integer resFieldId);

    /**
     * 根据字段id、枚举值id查询约束关系对于的枚举值
     * @author                   xiaogq
     * @param fieldId           字段id
     * @param resOptionId       枚举值id
     * @return
     */
    public List<SelectBox> getRestrictShowFields(Integer fieldId, Integer resOptionId);

    /**
     * 保存(编辑)属性级控制
     * @author                  xiaogq
     * @param fieldId          被约束字段id
     * @param list              约束关系集合信息
     * @param resOptionId      枚举值id
     * @param resOptionName    枚举值名称
     * @return
     */
    public int setRestrictShowFields(Integer fieldId, List<SelectBox> list, Integer resFieldId, Integer resOptionId, String resOptionName);

}
